<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script>
		class Point{
			//一个类必须有constructor方法，没有时默认构造一个空的constructor方法
			//new 一个类时，默认调用constructor方法
			constructor(x,y){
				this.x = x;
				this.y = y;
			}
			toString(){
				return '('+this.x+","+this.y+')';
			}
			add(){
				return this.x + this.y;
			}
		}
		let point = new Point(1,2);
		
		console.log(point.toString());
		console.log(point.add());
		
		//一个可以立即执行的类
		(new class{
			constructor(name){
				this.name = name;
			}
			getName(){
				console.log(this.name);
			}
		}('张三')).getName();
		
		//class的静态方法
		//class的静态方法只能通过class本身来调用，不能通过实例来调用
		class Foo{
			//若静态方法中包含this，则this指向的是类本身而不是实例对象
			static myOwnFunc(){
				console.log('this is a static function');
			}
			constructor(x,y){
				this.x = x;
				this.y = y;
			}
			add(){
				return this.x + this.y;
			}
		}
		let foo = new Foo(1,2);
		//foo.myOwnFunc();//foo.myOwnFunc is not a function
		//Foo.myOwnFunc();//this is a static function
		
		//父类的静态方法可以被子类继承
		class Bar extends Foo{
			
		}
		Bar.myOwnFunc();//this is a static function
	
		//class的静态属性和实例属性
		//class的静态属性是class本身的属性，实例是没法对其进行操作的
		//class的实例属性是可以通过实例来进行操作的
		//定义静态属性只能通过class名.静态属性名
		//父类的静态属性可以被子类继承
		Bar.foo = '静态属性';
		Foo.staticFoo = '父类的静态属性';
		console.log(Bar.foo);
		console.log(Bar.staticFoo);
		
		//父类的构造方法、静态属性、实例属性、实例方法、静态方法都可被子类继承
		let bar = new Bar(1,2);
		console.log(bar.add());
		
		//new.target 一般用在构造函数中，用来判断该构造函数是怎么调用的，
			//通过new方式调用的返回该构造函数的名称
			//直接调用的，非new方式调用的返回undefined
		
		//new.target 用在class中返回当前class的名称
		//子类继承父类的时候返回的是子类的名称
	</script>
</html>
